package com.example.demo.controller;


import com.example.demo.common.AjaxResult;
import com.example.demo.common.ApplicationVariable;
import com.example.demo.common.PasswordTools;
import com.example.demo.common.UserSessionTools;
import com.example.demo.entity.UserInfo;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

/**
 * 首先要做的就是加注解@Controller @ResponseBody 或者 @RestController
 * 属性注入 Service
 */

@Controller
@ResponseBody
//@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;


    /**
     *  注册
     * @param userInfo
     * @return
     */
    // 这里前端传递的 “username” ，“password” 和后端 UserInfo 中的字段对应上了，框架会自动获取参数的，并赋值给 UserInfo userInfo
    @RequestMapping("/reg")
    public AjaxResult reg(UserInfo userInfo) {
        // 前端已经进行非空效验了，那么后端要不要进行非空效验
        // 铁律：后端开发：永远不要相信前端！！！
        // 1.进行非空判断
        if(userInfo == null || userInfo.getUsername() == null || userInfo.getUsername().equals("") ||
                // StringUtils.hasLength() 进行判断非空且不是空格（也就是既判断null 又判断空）
                !StringUtils.hasLength(userInfo.getPassword()) ){
            return AjaxResult.fail(-1,"参数有误为空");
        }
        /**
         * todo: 存储加盐加密之后的密码，将密码给替换掉
         */
        // 最后新加的代码
        userInfo.setPassword(PasswordTools.encrypt(userInfo.getPassword()));

        int result = userService.reg(userInfo);
        return AjaxResult.success(result);
        //return AjaxResult.success(0);
    }

    /**
     * 登录
     * 此处不用的对象也可以，因为登录在哪都是传递 username 和 password，不太可能会增加和修改字段
     * 验证码 是单独验证的
     */
    @RequestMapping("/login")   // 这里直接写 HttpServletRequest ，框架会自动帮我们注入的
    public AjaxResult login(String username , String password, HttpServletRequest request) {
        // 1.非空校验
        if(username == null || username.equals("") ||
                // StringUtils.hasLength() 进行判断非空且不是空格（也就是既判断null 又判断空）
                !StringUtils.hasLength(password) ){
            return AjaxResult.fail(-1,"参数有误为空");
        }
        UserInfo userInfo = userService.login(username);
        // userInfo.getId() <= 0 说明没有查到
        if(userInfo == null || userInfo.getId() <= 0)
            // 登陆的时候，不要告诉用户 具体错误，不然可能会被暴力破解
            //return AjaxResult.fail(-2,"用户名有误");
            return AjaxResult.fail(-2,"用户名或密码有误");
        /**
         * 此处用 equals，用 == 可以不
         * == 是比较对象地址，equals是比较内容
         * ==操作符比较的是两个对象的引用（即内存地址），判断它们是否指向同一个对象。
         * 而equals()方法是用于比较两个对象的内容是否相等。
         */
        /**
         *  新加todo，比较加盐之后的密码是否正确. 数据库中存储的就是加密之后的
         */
        // 最后新加的代码
        boolean result = PasswordTools.decrypt(password,userInfo.getPassword());
        if(!result)
            return AjaxResult.fail(-2,"用户名或密码有误");

//        if(!password.equals(userInfo.getPassword()))
//            return AjaxResult.fail(-2,"用户名或密码有误");

        // 通过 session 来判断用户是否已经登陆了
        //  将当前成功登录的用户信息存储到 session
        HttpSession session = request.getSession(); // getSession() 里面默认是true，没有就创建
        // 因为有多处写到 "userinfo" 这个key值，所以设置成全局变量放在公共类，主要作用是为了防止写错
        session.setAttribute(ApplicationVariable.SESSION_KEY_USERINFO,userInfo);

        return AjaxResult.success(1);
    }

    @RequestMapping("/logout") // 返回统一数据
    public AjaxResult logout(HttpServletRequest request) {
        // 因为前面拦截器已经写过登录判断了，所以这里写true 和 false都一样
        // true 和 false 区别是没有会话的时候创建不创建，那现在通过拦截器肯定是有会话的
        HttpSession session = request.getSession(true);
        // 注意移除会话，不是在 userinfo 中把用户给删除掉。只是之前的登录信息给去掉
        session.removeAttribute(ApplicationVariable.SESSION_KEY_USERINFO);
        return AjaxResult.success(1);
    }


    /**
     *   判断用户是否已经登录
     */
    @RequestMapping("/islogin")
    public AjaxResult isLogin(HttpServletRequest request) {
        UserInfo userInfo = UserSessionTools.getLoginUser(request);
        if(userInfo == null) {
            return AjaxResult.success(0);
        }
        return AjaxResult.success(1);
    }


}
